// array globale per mantenere un elenco dei feed già parsati
var parsers = new Array();

// Funzione che registra gli eventi della pagina in maniera tradizionale, evitando le 
// dichiarazioni di eventi inline
function registerPageEvents() 
{
    // FEEDS FILTER
    Common.addEvent(document.getElementById("feeds_filter_tool"), "click", function () 
    {
        return Common.toggle(document.getElementById('feed_filter'));
    });
    // ITEMS FILTER
    Common.addEvent(document.getElementById("items_filter_tool"), "click", function () 
    {
        return Common.toggle(document.getElementById('items_filter'));
    });
    // FEEDS FILTER SUBMIT
    Common.addEvent(document.getElementById("feeds_filter_submit"), "click", function () 
    {
        filter(document.getElementById('feed_list'), document.getElementById('feed_search').value);
    });
    // ITEMS FILTER SUMBIT
    Common.addEvent(document.getElementById("items_filter_submit"), "click", function () 
    {
        filter(document.getElementById('item_list'), document.getElementById('items_search').value);
    });
    var groups = document.getElementById("feed_list").getElementsByTagName("li");
    // aggiungo i Common.toggle agli ul
    for (var i = 0; i < groups.length; i++) 
    {
        if (groups[i].parentNode == document.getElementById("feed_list")) 
        {
            //var fun = new Function('Common.toggle(document.getElementById("feed_list").getElementsByTagName("li")['+ i.toString() +'].getElementsByTagName("ul")[0]);'); 
            var fun = new Function('Common.toggle(this.parentNode.getElementsByTagName("ul")[0]);');
            Common.addEvent(groups[i].getElementsByTagName("a")[0], "click", fun);
            // scendo per aggiungere i checkVisited agli elementi
            for (var x = 0; x < groups[i].getElementsByTagName("ul").length; x++) 
            {
                var items = groups[i].getElementsByTagName("ul")[x].getElementsByTagName("li");
                for (var j = 0; j < items.length; j++) 
                {
                    //var l = items[j].getElementsByTagName("span")[0].getElementsByTagName("a")[0];
                    var fun2 = new Function('checkVisited(document.getElementById("feed_list").getElementsByTagName("li")[' + i.toString() + '].getElementsByTagName("ul")[0].getElementsByTagName("li")[' + j.toString() + '].getElementsByTagName("a")[0]);');
                    Common.addEvent( items[j].getElementsByTagName("a")[0], "click", fun2);
                }
            }
        }
    }
    Common.addEvent(document.getElementById("feed_wrapper_help"), "mouseover", function () 
    {
        Common.showTooltip("feed_wrapper_help", "front");
    });
    Common.addEvent(document.getElementById("feed_items_help"), "mouseover", function () 
    {
        Common.showTooltip("feed_items_help", "front");
    });
    Common.addEvent(document.getElementById("feed_content_help"), "mouseover", function () 
    {
        Common.showTooltip("feed_content_help", "rear");
    });
    Common.addEvent(document.getElementById("feed_wrapper_help"), "mouseout", function () 
    {
        Common.clearTooltip("feed_wrapper_help");
    });
    Common.addEvent(document.getElementById("feed_items_help"), "mouseout", function () 
    {
        Common.clearTooltip("feed_items_help");
    });
    Common.addEvent(document.getElementById("feed_content_help"), "mouseout", function () 
    {
        Common.clearTooltip("feed_content_help");
    });
}
// quando la pagina si carica completamente, vengono caricati gli eventi
Common.addEvent(window, "load", registerPageEvents);
/*
* loadFeedItem
* carica gli item di un feed Rss nell'apposito spazio.
*
*/
function loadFeedItems(linkToLoad) 
{
    var parser = new XParser("../cgi-bin/feedretrieve.pl?url=" + linkToLoad, false);
    parser.onload = function () 
    {
        //alert("parser -> on load");
        // se un feed non è ancora mai stato parsato inserisco il suo parser nell'elenco globale.
        // così ad ogni feed corrisponde uno ed un solo parser. Per averlo sempre aggiornato, rimuovo il
        // precedente
        var into = false;
        for (var j = 0; j < parsers.length; j++) 
        {
            if (parser.title.value == parsers[j].title.value) 
            {
                var p1 = parsers.slice(0, j);
                var p2 = parsers.slice(j + 1, parser.length + 1);
                parsers = p1.concat(p2);
            }
        }
        parsers.push(parser);
        var cont = document.getElementById("feed_items_wrapper");
        // elimina il div creato per mostrare all'utente il caricamento
        if (document.getElementById("loading") != null) {
            cont.removeChild(document.getElementById("loading"));
        }
        //creazione della lista degli item e dei suoi contenuti
        var list = document.createElement("ul");
        list.id = "item_list";
        //alert("items created");
        for (var i = 0; i < parser.items.length; i++) 
        {
            var li = document.createElement("li");
            var h3 = document.createElement("h3");
            var a = document.createElement("a");
            a.href = "#feed_content_wrapper";
            var fTitle = parser.title.value;
            var pTitle = parser.items[i].title.value.replace(/\"/g, "&quot;");
            var funBody = 'checkVisited(this); loadItemDescription("' + fTitle + '","' + pTitle + '")';
            // ATTENZIONE!!!!
            // evt è il parametro evento, perchè questa funzione scaturisce da un evento 
            a.onclick = new Function("evt", funBody);
            a.innerHTML = parser.items[i].title.value;
            h3.appendChild(a);
            li.appendChild(h3);
            var par = document.createElement("p");
            par.innerHTML = (parser.items[i].date.value != false) ? parser.items[i].date.value : "Date not specified";
            li.appendChild(par);
            list.appendChild(li);
        }
        // aggiunta della lista alla pagina
        cont.appendChild(list);
    }
}
/*
* loadItemDescription
* Carica la descrizione di un item nell'apposito spazio
* Passo a parametro il titolo del feed e il titolo del post
*/
function loadItemDescription(theTitle, postTitle) 
{
    //alert("loading " + theTitle + " " + postTitle);
    // controllo che feed esista, controllando che corrisponda il suo titolo ad uno dei presenti nel parser
    var postParser = null;
    for (var j = 0; j < parsers.length; j++) {
        if (theTitle == parsers[j].title.value) {
            postParser = parsers[j];
        }
    }
    // se ho trovato un feed corrispondente, posso continuare con il processo
    if (postParser != null) 
    {
        // ripeto il processo precedente anche per il titolo del post
        var item = null;
        for (var i = 0; i < postParser.items.length; i++) 
        {
            if (postTitle.replace(/&quot;/g, "\"") == postParser.items[i].title.value) {
                item = postParser.items[i];
            }
        }
        // se ho trovato un post corrispondente, posso caricarlo
        if (item != null) 
        {
            var cont = document.getElementById("feed_content_wrapper");
            // nel caso in cui sia il primo caricamento, ho il testo d'aiuto presente
            if (document.getElementById("he_cont") != null) {
                cont.removeChild(document.getElementById("he_cont"));
            }
            // pulisco dai caricamenti precedenti
            if (document.getElementById("p_t") != null) 
            {
                cont.removeChild(document.getElementById("p_t"));
                cont.removeChild(document.getElementById("t_t"));
                cont.removeChild(document.getElementById("dat"));
                cont.removeChild(document.getElementById("share_box"));
                cont.removeChild(document.getElementById("inner"));
            }
            // creo i nuovi elementi
            var h2 = document.createElement("h2");
            h2.id = "p_t";
            // titolo post
            var h4 = document.createElement("h4");
            h4.id = "t_t";
            // occhiello
            var h6 = document.createElement("h6");
            h6.id = "dat";
            var ext_link = document.createElement("a");
            ext_link.href = item.link.value;
            ext_link.setAttribute("target", "_blank");
            ext_link.appendChild(document.createTextNode("link to original post"));
            // social box
            var share_box = document.createElement("div");
            share_box.id = "share_box";
            var share_list = document.createElement("ul");
            var share_links = ["http://www.facebook.com/share.php?u=", "http://www.furl.net/storeIt.jsp?u=", 
            "http://technorati.com/faves/?add=", "http://del.icio.us/post?url=", "http://digg.com/submit?phase=2&url=" ];
            var share_images = ["facebook", "furl", "technocrati", "delicious", "digg" ];
            var share_titles = ["Share on Facebook!", "Furl it!", "Fav on Technocrati!", "Add on del.icio.us!", 
            "Digg this post!" ];
            for (var s = 0; s < share_links.length; s++) 
            {
                var share_item = document.createElement("li");
                var share_a = document.createElement("a");
                share_a.href = share_links[s] + item.link.value;
                share_a.title = share_titles[s];
                var share_img = document.createElement("img");
                share_img.src = "../images/icons/" + share_images[s] + "_share.gif";
                share_img.alt = share_titles[s];
                share_a.appendChild(share_img);
                share_item.appendChild(share_a);
                share_list.appendChild(share_item);
            }
            share_box.appendChild(share_list);
            var par = document.createElement("div");
            par.id = "inner";
            // riempio di contenuto i nuovi elementi
            h2.innerHTML = postTitle;
            h4.innerHTML = theTitle;
            var theDate = (item.date.value != false) ? (item.date.value + " - ") : ("Unknow date - ");
            h6.appendChild(document.createTextNode(theDate));
            h6.appendChild(ext_link);
            par.innerHTML = (item.description.value != false) ? item.description.value : 'No description specified. <a href="' + item.link.value + '" target="_blank">Travel to original post</a> for complete informations';
            var lin_in = par.getElementsByTagName("a");
            for (var c = 0; c < lin_in.length; c++) {
                lin_in[c].setAttribute("target", "_blank");
            }
            // carico i nuovi elementi nella pagina
            cont.appendChild(h4);
            cont.appendChild(h2);
            cont.appendChild(h6);
            cont.appendChild(share_box);
            cont.appendChild(par);
        }
    }
}
/*
* checkVisited
* Cambia i colori di sfondo ai feed item già visitati. Per cambiare i colori non agisce sullo stile vero
* e proprio cambiando proprietà css ma va a cambiare le classi a cui sono associati gli elementi
* @param node il nodo a cui cambiare colore
*/
function checkVisited(node) 
{
    // prendo la lista dei gruppi
    var groupList = node.parentNode.parentNode.parentNode.parentNode;
    var list = null;
    // se sto analizzando i feed
    if (groupList.id == "feed_list") 
    {
        // scorro i gruppi
        for (var j = 0; j < groupList.getElementsByTagName("ul").length; j++) 
        {
            // list rappresenta un gruppo 
            list = groupList.getElementsByTagName("ul")[j];
            for (var i = 0; i < list.getElementsByTagName("li").length; i++) 
            {
                // listItem rappresenta un item
                var listItem = list.getElementsByTagName("li")[i];
                // se il nodo che sto analizzando NON è il nodo parente di node, cioè il <li> corrispondente
                if (!(listItem == node.parentNode.parentNode)) 
                {
                    // se ho già visitato questo elemento
                    if (listItem.className.indexOf("visited") > - 1) {
                        // lo metto a non_visiting ma visitato
                        listItem.className = "non_visiting visited ";
                    }
                    else {
                        // altrimenti è semplicemente non_visiting
                        listItem.className = "non_visiting";
                    }
                }
                // se invece il nodo che sto analizzando è il li parente corrispondente
                else 
                {
                    // se lo stavo visitando (quindi è a visiting)
                    if (listItem.className.indexOf("visiting") > - 1) 
                    {
                        //  non lo sto visitando più, quindi lo metto a non visiting
                        listItem.className = "non_visiting visited";
                    }
                }
            }
        }
        // setto il nodo che clicco a visited e visiting
        node.parentNode.className = "visiting visited";
    }
    // qui invece tratto la parte items
    else 
    {
        // list rappresenta la lista di items
        list = groupList.getElementsByTagName("ul")[1];
        // scorro gli items
        for (var i = 0; i < list.getElementsByTagName("li").length; i++) 
        {
            // listItem rappresenta un item
            var listItem = list.getElementsByTagName("li")[i];
            // se il nodo che sto analizzando NON è il nodo parente di node, cioè il <li> corrispondente
            if (!(listItem == node.parentNode.parentNode)) 
            {
                // se ho già visitato questo elemento
                if (listItem.className.indexOf("visited") > - 1) {
                    // lo metto a non_visiting ma visitato
                    listItem.className = "non_visiting visited ";
                }
                else {
                    // altrimenti è semplicemente non_visiting
                    listItem.className = "non_visiting";
                }
            }
            // se invece il nodo che sto analizzando è il li parente corrispondente
            else 
            {
                // se lo stavo visitando (quindi è a visiting)
                if (listItem.className.indexOf("visiting") > - 1) 
                {
                    //  non lo sto visitando più, quindi lo metto a non visiting
                    listItem.className = "non_visiting visited";
                }
            }
        }
        // setto il nodo che clicco a visited e visiting
        node.parentNode.parentNode.className = "visiting visited";
    }
}
/*
* Filtra i contenuti dei feed e crea un nuovo gruppo con i contenuti filtrati
*
*/
function filter(source, p) 
{
    var returnList = [];
    var pattern = new RegExp(p, "i");
    if (source.id == "feed_list") 
    {
        var oldList = source;
        var groupList = oldList.getElementsByTagName("ul");
        for (var i = 0; i < groupList.length; i++) 
        {
            var feedsList = groupList[i].getElementsByTagName("li");
            for (var j = 0; j < feedsList.length; j++) 
            {
                var txt = Ajax.getText(feedsList[j].getElementsByTagName("span")[0]);
                // se la ricerca corrisponde al testo, aggiungo il feed ai risultati
                if (txt.match(pattern) != null) {
                    returnList.push(feedsList[j].cloneNode(true));
                }
            }
        }
    }
    if (source.id == "item_list") 
    {
        var items = source.getElementsByTagName("li");
        for (var i = 0; i < items.length; i++) 
        {
            var txt = Ajax.getText(items[i].getElementsByTagName("h3")[0]);
            if (txt.match(pattern) != null) {
                returnList.push(items[i].cloneNode(true));
            }
        }
    }
    if (returnList.length > 0) 
    {
        if (source.id == "feed_list") 
        {
            // creo il list item contenitore della nuova lista
            var contItem = document.createElement("li");
            source.insertBefore(contItem, source.childNodes[0]);
            // creo il titolo della lista filtro
            var listTitle = document.createElement("a");
            listTitle.href = "#";
            var funBody = "Common.toggle(this.parentNode.getElementsByTagName('ul')[0]); return false;";
            Common.addEvent(listTitle, "click", new Function("evt", funBody));
            listTitle.className = "group_title";
            listTitle.appendChild(document.createTextNode("Filter: " + p));
            contItem.appendChild(listTitle);
            // creazione della lista di nuovi elementi
            var newList = document.createElement("ul");
            newList.className = "feed_filter";
            for (var t = 0; t < returnList.length; t++) {
                newList.appendChild(returnList[t]);
            }
            contItem.appendChild(newList);
        }
        if (source.id == "item_list") 
        {
            var father = source.parentNode;
            father.removeChild(source);
            var newList = document.createElement("ul");
            newList.id = "item_list";
            for (var t = 0; t < returnList.length; t++) {
                newList.appendChild(returnList[t]);
            }
            father.appendChild(newList);
        }
    }
    return false;
}

